home *** CD-ROM | disk | FTP | other *** search
/ Komputer for Alle 2004 #2 / K-CD-2-2004.ISO / OpenOffice Sv / f_0397 / python-core-2.2.2 / lib / test / test_pow.py < prev    next >
Encoding:
Python Source  |  2003-07-18  |  3.8 KB  |  121 lines

  1. import sys
  2. import test_support
  3.  
  4.  
  5. def powtest(type):
  6.     if type != float:
  7.         print "    Testing 2-argument pow() function..."
  8.         for i in range(-1000, 1000):
  9.             if pow(type(i), 0) != 1:
  10.                 raise ValueError, 'pow('+str(i)+',0) != 1'
  11.             if pow(type(i), 1) != type(i):
  12.                 raise ValueError, 'pow('+str(i)+',1) != '+str(i)
  13.             if pow(type(0), 1) != type(0):
  14.                 raise ValueError, 'pow(0,'+str(i)+') != 0'
  15.             if pow(type(1), 1) != type(1):
  16.                 raise ValueError, 'pow(1,'+str(i)+') != 1'
  17.  
  18.         for i in range(-100, 100):
  19.             if pow(type(i), 3) != i*i*i:
  20.                 raise ValueError, 'pow('+str(i)+',3) != '+str(i*i*i)
  21.  
  22.         pow2 = 1
  23.         for i in range(0,31):
  24.             if pow(2, i) != pow2:
  25.                 raise ValueError, 'pow(2,'+str(i)+') != '+str(pow2)
  26.             if i != 30 : pow2 = pow2*2
  27.  
  28.         for othertype in int, long:
  29.             for i in range(-10, 0) + range(1, 10):
  30.                 ii = type(i)
  31.                 for j in range(1, 11):
  32.                     jj = -othertype(j)
  33.                     try:
  34.                         pow(ii, jj)
  35.                     except ValueError:
  36.                         raise ValueError, "pow(%s, %s) failed" % (ii, jj)
  37.  
  38.     for othertype in int, long, float:
  39.         for i in range(1, 100):
  40.             zero = type(0)
  41.             exp = -othertype(i/10.0)
  42.             if exp == 0:
  43.                 continue
  44.             try:
  45.                 pow(zero, exp)
  46.             except ZeroDivisionError:
  47.                 pass # taking zero to any negative exponent should fail
  48.             else:
  49.                 raise ValueError, "pow(%s, %s) did not fail" % (zero, exp)
  50.  
  51.     print "    Testing 3-argument pow() function..."
  52.     il, ih = -20, 20
  53.     jl, jh = -5,   5
  54.     kl, kh = -10, 10
  55.     compare = cmp
  56.     if type == float:
  57.         il = 1
  58.         compare = test_support.fcmp
  59.     elif type == int:
  60.         jl = 0
  61.     elif type == long:
  62.         jl, jh = 0, 15
  63.     for i in range(il, ih+1):
  64.         for j in range(jl, jh+1):
  65.             for k in range(kl, kh+1):
  66.                 if k != 0:
  67.                     if type == float or j < 0:
  68.                         try:
  69.                             pow(type(i),j,k)
  70.                         except TypeError:
  71.                             pass
  72.                         else:
  73.                             raise TestFailed("expected TypeError from "
  74.                                 "pow%r" % ((type(i), j, k)))
  75.                         continue
  76.                     if compare(pow(type(i),j,k), pow(type(i),j)% type(k)):
  77.                         raise ValueError, "pow(" +str(i)+ "," +str(j)+ \
  78.                              "," +str(k)+ ") != pow(" +str(i)+ "," + \
  79.                              str(j)+ ") % " +str(k)
  80.  
  81.  
  82. print 'Testing integer mode...'
  83. powtest(int)
  84. print 'Testing long integer mode...'
  85. powtest(long)
  86. print 'Testing floating point mode...'
  87. powtest(float)
  88.  
  89. # Other tests-- not very systematic
  90.  
  91. print 'The number in both columns should match.'
  92. print `pow(3,3) % 8`, `pow(3,3,8)`
  93. print `pow(3,3) % -8`, `pow(3,3,-8)`
  94. print `pow(3,2) % -2`, `pow(3,2,-2)`
  95. print `pow(-3,3) % 8`, `pow(-3,3,8)`
  96. print `pow(-3,3) % -8`, `pow(-3,3,-8)`
  97. print `pow(5,2) % -8`, `pow(5,2,-8)`
  98. print
  99.  
  100. print `pow(3L,3L) % 8`, `pow(3L,3L,8)`
  101. print `pow(3L,3L) % -8`, `pow(3L,3L,-8)`
  102. print `pow(3L,2) % -2`, `pow(3L,2,-2)`
  103. print `pow(-3L,3L) % 8`, `pow(-3L,3L,8)`
  104. print `pow(-3L,3L) % -8`, `pow(-3L,3L,-8)`
  105. print `pow(5L,2) % -8`, `pow(5L,2,-8)`
  106. print
  107.  
  108. print
  109.  
  110. for i in range(-10, 11):
  111.     for j in range(0, 6):
  112.         for k in range(-7, 11):
  113.             if j >= 0 and k != 0:
  114.                 o = pow(i,j) % k
  115.                 n = pow(i,j,k)
  116.                 if o != n: print 'Integer mismatch:', i,j,k
  117.             if j >= 0 and k != 0:
  118.                 o = pow(long(i),j) % k
  119.                 n = pow(long(i),j,k)
  120.                 if o != n: print 'Integer mismatch:', i,j,k
  121.